%-----------------------------------------------------
% Dispositivos Semiconductores 66.25/86.03
% TP 1 - Curvas características del transistor MOSFET
% Alumnos:
% 	*
%	* 91523 Vazquez, Matias Fernando
%-----------------------------------------------------


function NgraficarVg(directorio)

% CONSTANTES

V=0:0.1:5;
I=0:0.1:5;

%---------- INGRESO DE DATOS ------------------------

simulacion1 = dlmread(strcat(directorio, 'simulacion.txt'),'\t',1,0);
medicion1 = dlmread(strcat(directorio, 'medicion1.txt'),'\t',1,0);
medicion2 = dlmread(strcat(directorio, 'medicion2.txt'),'\t',1,0);
medicion3 = dlmread(strcat(directorio, 'medicion3.txt'),'\t',1,0);
medicion4 = dlmread(strcat(directorio, 'medicion4.txt'),'\t',1,0);
medicion5 = dlmread(strcat(directorio, 'medicion5.txt'),'\t',1,0);
simulacion2 = dlmread(strcat(directorio, 'simulacion2.txt'),'\t',1,0);
% '\t'="TAB"; como la primer fila es el encabezado, se omite esta fila en la lectura
simulacion1(:,2)=simulacion1(:,2)*1000;	% Normalización a mA
simulacion2(:,2)=simulacion2(:,2)*1000;

%---------- AJUSTES ---------------------------------

rsimulacion1 =simulacion1;					% Se inicializa una nueva matriz
rsimulacion1(:,2)=sqrt(rsimulacion1(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)
Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rsimulacion1(20:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B
	
k_spice_simulacion1=(Param(1)^2)*2/1000																			% Es fundamental transponer la matriz para que fminsearch funcione
ksimulacion1=Param(1)^2	% mA/V^2
VTsimulacion1=-Param(2)/Param(1)


rmedicion1 = medicion1;					% Se inicializa una nueva matriz
rmedicion1(:,2)=sqrt(rmedicion1(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)
Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion1(2:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B						

k_spice_medicion1=(Param(1)^2)*2/1000   % A/V^2
kmedicion1=Param(1)^2
VTmedicion1=-Param(2)/Param(1)


rmedicion2 = medicion2;					% Se inicializa una nueva matriz
rmedicion2(:,2)=sqrt(rmedicion2(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)
Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion2(2:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B
																				% Es fundamental transponer la matriz para que fminsearch funcione
k_spice_medicion2=(Param(1)^2)*2/1000   % A/V^2
kmedicion2=Param(1)^2	% mA/V^2
VTmedicion2=-Param(2)/Param(1)

rmedicion3 = medicion3;					% Se inicializa una nueva matriz
rmedicion3(:,2)=sqrt(rmedicion3(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion3(2:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B
				
k_spice_medicion3=(Param(1)^2)*2/1000   % A/V^2
kmedicion3=Param(1)^2	% mA/V^2
VTmedicion3=-Param(2)/Param(1)

rmedicion4 = medicion4;					% Se inicializa una nueva matriz
rmedicion4(:,2)=sqrt(rmedicion4(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)

Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion4(2:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B
				
k_spice_medicion4=(Param(1)^2)*2/1000   % A/V^2
																				% Es fundamental transponer la matriz para que fminsearch funcione
kmedicion4=Param(1)^2	% mA/V^2
VTmedicion4=-Param(2)/Param(1)


rmedicion5 = medicion5;					% Se inicializa una nueva matriz
rmedicion5(:,2)=sqrt(rmedicion5(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)
Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rmedicion5(2:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B
				
k_spice_medicion5=(Param(1)^2)*2/1000   % A/V^2
																				% Es fundamental transponer la matriz para que fminsearch funcione
kmedicion5=Param(1)^2	% mA/V^2
VTmedicion5=-Param(2)/Param(1)


rsimulacion2 =simulacion2;					% Se inicializa una nueva matriz
rsimulacion2(:,2)=sqrt(rsimulacion2(:,2));	% Se toma raiz a toda la columna de corrientes. Unidad: raiz(mA)
Param=fminsearch('A_x_mas_B',[.707 -1.06],[0,0.0001,0,0,0,0,0,0,0,],[],rsimulacion2(20:end,:)');	% Param es un vector donde el primer elemento es A y el segundo B
									
k_spice_simulacion2=(Param(1)^2)*2/1000
											% Es fundamental transponer la matriz para que fminsearch funcione
ksimulacion2=Param(1)^2	% mA/V^2
VTsimulacion2=-Param(2)/Param(1)

%---------- GRAFICOS --------------------------------

% GRAFICOS DE LA RAIZ DE LA CORRIENTE

figure
hold on

plot(rsimulacion1(:,1),rsimulacion1(:,2),'bo','Markersize',5)
plot(V(19:end),sqrt(ksimulacion1)*(V(19:end)-VTsimulacion1),'b-','Linewidth',2)

plot(rmedicion1(:,1),rmedicion1(:,2),'ro','Markersize',5)
plot(V(3:end),sqrt(kmedicion1)*(V(3:end)-VTmedicion1),'r-','Linewidth',2)

plot(rmedicion2(:,1),rmedicion2(:,2),'go','Markersize',5)
plot(V(4:end),sqrt(kmedicion2)*(V(4:end)-VTmedicion2),'g-','Linewidth',2)

plot(rmedicion3(:,1),rmedicion3(:,2),'co','Markersize',5)
plot(V(15:end),sqrt(kmedicion3)*(V(15:end)-VTmedicion3),'c-','Linewidth',2)

plot(rmedicion4(:,1),rmedicion4(:,2),'mo','Markersize',5)
plot(V(10:end),sqrt(kmedicion4)*(V(10:end)-VTmedicion4),'m-','Linewidth',2)

plot(rmedicion5(:,1),rmedicion5(:,2),'ko','Markersize',5)
plot(V(20:end),sqrt(kmedicion5)*(V(20:end)-VTmedicion5),'k-','Linewidth',2)

plot(rsimulacion2(:,1),rsimulacion2(:,2),'yo','Markersize',5)
plot(V(10:end),sqrt(ksimulacion2)*(V(10:end)-VTsimulacion2),'y-','Linewidth',2)


legend('simulacion CB4007', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion1, VTsimulacion1), 
	   '1er transistor integrado 1', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion1, VTmedicion1),
	   '2do transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion2, VTmedicion2),
	   '3er transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion3, VTmedicion3),
	   '1er transistor integrado 2',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion4, VTmedicion4),
	   '1er transistor integrado 3',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion5, VTmedicion5),
	   'modelo propio',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion2, VTsimulacion2),
	   'Location','Northwest')

%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Tension V_{GS} [Volts]')
ylabel('Raiz Corriente raiz(I_D) [raiz(mA)]')
axis([0 5 0 3])
grid minor

% Una vez generada la imagen, se imprime a un archivo (recordar "help print" para obtener ayuda con la funcion).
print('N_sqrtID_VG.png','-dpng');


% GRAFICOS DE LAS CURVAS
% Luego, se debe graficar la curva cuadrática.
figure
hold on
plot(simulacion1(:,1),simulacion1(:,2),'bo','Markersize',5)
plot(V(20:end),ksimulacion1*(V(20:end)-VTsimulacion1).^2,'b-','Linewidth',2)

plot(medicion1(:,1),medicion1(:,2),'ro','Markersize',5)
plot(V(5:end),kmedicion1*(V(5:end)-VTmedicion1).^2,'r-','Linewidth',2)

plot(medicion2(:,1),medicion2(:,2),'go','Markersize',5)
plot(V(5:end),kmedicion2*(V(5:end)-VTmedicion2).^2,'g-','Linewidth',2)

plot(medicion3(:,1),medicion3(:,2),'co','Markersize',5)
plot(V(16:end),kmedicion3*(V(16:end)-VTmedicion3).^2,'c-','Linewidth',2)

plot(medicion4(:,1),medicion4(:,2),'mo','Markersize',5)
plot(V(11:end),kmedicion4*(V(11:end)-VTmedicion4).^2,'m-','Linewidth',2)

plot(medicion5(:,1),medicion5(:,2),'ko','Markersize',5)
plot(V(21:end),kmedicion5*(V(21:end)-VTmedicion5).^2,'k-','Linewidth',2)

plot(simulacion2(:,1),simulacion2(:,2),'yo','Markersize',5)
plot(V(11:end),ksimulacion2*(V(11:end)-VTsimulacion2).^2,'y-','Linewidth',2)


% GRAFICOS DE LOS AJUSTES


% Primero deben graficarse todoas las mediciones y simulaciones, luego los ajustes
legend('simulacion CB4007', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion1, VTsimulacion1), 
	   '1er transistor integrado 1', sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion1, VTmedicion1),
	   '2do transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion2, VTmedicion2),
	   '3er transistor integrado 1',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion3, VTmedicion3),
	   '1er transistor integrado 2',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion4, VTmedicion4),
	   '1er transistor integrado 3',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', kmedicion5, VTmedicion5),
	   'modelo propio',sprintf('ajuste con k = %f mA/V^2 y VT= %f V', ksimulacion2, VTsimulacion2),
	   'Location','Northwest')
%legend(LEYENDA1,LEYENDA2,LEYENDA3,LEYENDA4,'Location','Northwest')

%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Tension V_{GS} [Volts]')
ylabel('Corriente I_D [mA]')
grid minor

print('N_ID_VG.png','-dpng');


%---------------------------------------------------------------------------------------------------------------
% Grafico de la transconductancia gm calculada;
%  - A partir del cociente de diferencias
%  - A partir de gm=2*raiz(k*ID)
%---------------------------------------------------------------------------------------------------------------
% Para graficar las curvas TEORICAS, nos ayudamos de un vector auxiliar para las tensiones

% Calculamos gm como cociente de diferencias
gm_simulacion1=diff(simulacion1(:,2)/1000)./diff(simulacion1(:,1));
gm_simulacion2=diff(simulacion2(:,2)/1000)./diff(simulacion2(:,1));
gm_medicion1=diff(medicion1(:,2)/1000)./diff(medicion1(:,1));
gm_medicion2=diff(medicion2(:,2)/1000)./diff(medicion2(:,1));
gm_medicion3=diff(medicion3(:,2)/1000)./diff(medicion3(:,1));
gm_medicion4=diff(medicion4(:,2)/1000)./diff(medicion4(:,1));
gm_medicion5=diff(medicion5(:,2)/1000)./diff(medicion5(:,1));

figure
hold on
plot(simulacion1(2:end,2),gm_simulacion1,'bo','Markersize',5)
plot(I,2*sqrt(ksimulacion1/1000*I/1000),'b-','Linewidth',2)		% /1000 es para normalizar las unidades de gm

plot(medicion1(2:end,2),gm_medicion1,'ro','Markersize',5)
plot(I,2*sqrt(kmedicion1/1000*I/1000),'r-','Linewidth',2)

plot(medicion2(2:end,2),gm_medicion2,'go','Markersize',5)
plot(I,2*sqrt(kmedicion2/1000*I/1000),'g-','Linewidth',2)

plot(medicion3(2:end,2),gm_medicion3,'co','Markersize',5)
plot(I,2*sqrt(kmedicion3/1000*I/1000),'c-','Linewidth',2)

plot(medicion4(2:end,2),gm_medicion4,'mo','Markersize',5)
plot(I,2*sqrt(kmedicion4/1000*I/1000),'m-','Linewidth',2)

plot(medicion5(2:end,2),gm_medicion5,'ko','Markersize',5)
plot(I,2*sqrt(kmedicion5/1000*I/1000),'k-','Linewidth',2)

plot(simulacion2(2:end,2),gm_simulacion2,'yo','Markersize',5)
plot(I,2*sqrt(ksimulacion2/1000*I/1000),'y-','Linewidth',2)		% /1000 es para normalizar las unidades de gm


legend('simulacion CB4007', sprintf('calculo teorico con k = %f mA/V^2', ksimulacion1), 
	   '1er transistor integrado 1', sprintf('calculo teorico con k = %f mA/V^2', kmedicion1),
	   '2do transistor integrado 1',sprintf('calculo teorico con k = %f mA/V^2', kmedicion2), 
	   '3er transistor integrado 1',sprintf('calculo teorico con k = %f mA/V^2', kmedicion3),
	   '1er transistor integrado 2',sprintf('calculo teorico con k = %f mA/V^2', kmedicion4),
	   '1er transistor integrado 3',sprintf('calculo teorico con k = %f mA/V^2', kmedicion5),
	   'modelo propio', sprintf('calculo teorico con k = %f ma/V^2', ksimulacion2),
	   'Location','Northwest')
	   
%-----------------------------------------------------
%Estos comandos agregan rotulos y detalles a los graficos
xlabel('Corriente I_D [mA]')
ylabel('g_m [Ohm^-^1]')
axis([0 5 0 0.005])
grid minor

print('N_GM_ID.png','-dpng');
